package com.cskaoyan.javase.array._7var;

import javax.xml.transform.sax.SAXTransformerFactory;

/**
 * 实现一个方法在调用时能够填入不确定的个数,需要使用可变参数作为方法的形参
 * 语法:
 *      [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 * 	        //方法体
 *      }
 *
 * 注意事项:
 *      1.数据类型... 变量名 写在形参列表的最后面,称之为可变参数
 *      2.可变参数必须写在形参列表的最后面,不能写在中间或者前面
 *      3.可变参数的"..."建议紧跟数据类型,空格后加上变量名
 *      4.可变参数的实质是对应类型的数组
 *      5.带有可变参数的方法，允许调用方法时，直接填入不确定个数的对应数据类型的参数
 *      6.如果带有可变参数的方法构成方法的重载仍然遵循就近原则
 *          如果有确定个数的方法能够匹配，那么优先选择确定个数的方法
 *      7.带可变参数的方法组成方法重载时要慎重，否则容易导致方法不可用
 *      8.可变参数一个方法最多有一个
 *
 * 额外补充：
 *      可变参数的实质仍然是数组，调用可变参数的方法时，编译器为该可变参数隐含创建一个数组，在方法体中以数组的形式访问可变参数
 *      像这种实现的原理不改变，但是在底层代码中完成了某些实现，可以节省程序员的编码时间，这种语法称之为“语法糖”
 *
 */

/**
 * @description: Java可变参数
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(sum(arr));
        //System.out.println(sum(12,3,44,1,new int[]{1,2,3})); 不行


        /*System.out.println(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
        System.out.println(sum(1,1));*/

        //Ambiguous method call: both 'Demo.sum(int...)' and 'Demo.sum(int, int...)' match
        //sum(1,2,1,3);

        sum(1.0,arr);
        sum(1,arr);
    }


    //案例: 求不确定个数变量的和,所以需要一个数组作为形参
    //'sum(int[])' is already defined in 'com.cskaoyan.javase.array._7var.Demo'
    /*public static int sum(int[] arr) {
        //数组求和
        int sumValue = 0;
        for (int element : arr) {
            sumValue += element;
        }
        return sumValue;
    }*/

    //新的需求: 希望能够直接在调用方法时随意得写出参数的个数,类似sum(1,2,3,4...) 这就意味着实参的个数是不确定的
    //'sum(int...)' is already defined in 'com.cskaoyan.javase.array._7var.Demo'
    public static int sum(int... var) {
        for (int i = 0; i < var.length; i++) {
            System.out.println(var[i]);
        }
        //var是一个int类型数组
        //数组求和
        int sumValue = 0;
        for (int element : var) {
            sumValue += element;
        }
        return sumValue;
    }
    public static int sum(int a,int... var) {
        for (int i = 0; i < var.length; i++) {
            System.out.println(var[i]);
        }
        //var是一个int类型数组
        //数组求和
        int sumValue = 0;
        for (int element : var) {
            sumValue += element;
        }
        return sumValue;
    }

    public static double sum(double a, int... var) {
        //var是一个int类型数组
        //数组求和
        int sumValue = 0;
        for (int element : var) {
            sumValue += element;
        }
        return sumValue + a;
    }

   /* public static double sum(double... var) {
        //var是一个int类型数组
        //数组求和
        double sumValue = 0;
        for (double element : var) {
            sumValue += element;
        }
        return sumValue;
    }

    public static int sum(int a, int b) {
        return a + b;
    }*/
}
